/*******************************************************************************
*
* File Name:          ForumboardDAO.java
*
* Created:            2006/10/29 03:44:51
*
* Original Author:    njo soft
*
*------------------------------------------------------------------------------
* MODIFICATION HISTORY
*------------------------------------------------------------------------------
* WHEN                WHO                 WHY
* 2006/10/29 03:44:51 yu.peng             new
*------------------------------------------------------------------------------
*
******************************************************************************/
/*******************/
/* PACKAGE SECTION */
/*******************/
package org.njo.webapp.root.model.dao;

/*******************/
/* IMPORT SECTION  */
/*******************/
import org.njo.webapp.root.utility.ObjectNotExistsException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

/**
 * 数据访问对象.<br>
 * 访问数据库中表数据.
 * 提供以下几种方法:
 * <OL>
 * <LI><B>insert</B> 向数据库表中插入一条记录.</LI>
 * <LI><B>update</B> 更新数据库表中某条记录.</LI>
 * <LI><B>delete</B> 删除数据库表中指定主键的数据.</LI>
 * <LI><B>deleteAllRecords</B> 删除数据库表中所有的数据.</LI>
 * <LI><B>select</B> 从数据库表中取得指定主键的数据.</LI>
 * <LI><B>selectAllRecords(int,int)</B> 从数据库表中取得指定索引范围的所有数据.</LI>
 * <LI><B>selectAllRecords</B> 从数据库表中取得所有数据.</LI>
 * <LI><B>size</B> 从数据库表中取得所有数据的条数.</LI>
 * </OL>
 *
 * <pre>
 * 使用方法:
 *     Connection connection = null;
 *     ForumboardDAO forumboardDAO = null;
 *
 *     // open the database connection.
 *     try {
 *         connection = SystemContext.getDatabaseConnection();
 *     } catch (Throwable tw) {
 *         logger.error(tw);
 *         throw new ActivityError(tw);
 *     }
 *
 *     try {
 *         // access the database.
 *         // call the DAO Object insert the record into DB.
 *         forumboardDAO = new ForumboardDAO(connection);
 *         count = forumboardDAO.insert( new Forumboard());
 *
 *         connection.commit();
 *     } catch (SQLException ex) {
 *         // when fail rollback the updated's data.
 *         try {
 *             connection.rollback();
 *         } catch (Throwable tw) {
 *             // when rollback fail,log the info.
 *             logger.error(tw);
 *         }
 *         logger.error(ex);
 *         throw new ActivityError(ex);
 *     } finally {
 *         try {
 *             if (connection != null) {
 *                 SystemContext.closeConnection(connection);
 *             }
 *         } catch (Throwable tw) {
 *             //
 *             logger.error(tw);
 *             throw new ActivityError(tw);
 *         }
 *     }
 * 注意:
 *     数据库连接对象(java.sql.Connection)的实例应由调用者创建,提供并操作,
 *     在本对象中不对数据库连接对象(java.sql.Connection)的实例进行任何操作,
 *     在本对象中不对任何的SQL异常处理,需要由调用者处理相应的SQL异常.
 * </pre>
 * @author yu.peng
 * @version 1.00
 */
public class ForumboardDAO {

    /**
     * 数据库连接对象.
     */
    private Connection connection = null;

    /**
     * 构造函数.<br>
     * 需要一个数据库连接对象作为参数.
     *
     * @param argConnection 数据库连接对象
     */
    public ForumboardDAO( Connection argConnection ) {
        connection = argConnection;
    }

    /**
     * 取得所有的根版块.
     *
     * @return
     * @throws SQLException
     */
    public List getBoardFolder() throws SQLException {
        StringBuffer selectSql = null;
        PreparedStatement selectStatement = null;
        ResultSet resultSet = null;
        Map forumboard = null;
        List resultList = new ArrayList ();
        try {
            selectSql = new StringBuffer ();
            selectSql.append(" SELECT ID , ");
            selectSql.append("        TITLE , ");
            selectSql.append("        DESCRIPTION  ");
            selectSql.append(" FROM FORUMBOARD ");
            selectSql.append(" WHERE BOARD IS NULL ");

            selectStatement = connection.prepareStatement (
                    selectSql.toString (),
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY );

            resultSet = selectStatement.executeQuery ();

            while (resultSet.next()) {
                forumboard = new HashMap();
                forumboard.put("id", resultSet.getString(1));
                forumboard.put("title", resultSet.getString(2));
                forumboard.put("description", resultSet.getString(3));
                resultList.add ( forumboard );
            }
        } finally {
            if ( resultSet != null ) {
                resultSet.close ();
                resultSet = null;
            }
            if ( selectStatement != null ) {
                selectStatement.close ();
                selectStatement = null;
            }
        }
        return resultList;
    }

    /**
     * 取得所有的根版块.
     *
     * @return
     * @throws SQLException
     */
    public List getBoards(String folderBoard) throws SQLException {
        StringBuffer selectSql = null;
        PreparedStatement selectStatement = null;
        ResultSet resultSet = null;
        Map forumboard = null;
        List resultList = new ArrayList ();
        try {
            selectSql = new StringBuffer ();
            selectSql.append(" SELECT ID , ");
            selectSql.append("        TITLE , ");
            selectSql.append("        DESCRIPTION  ");
            selectSql.append(" FROM FORUMBOARD ");
            selectSql.append(" WHERE BOARD = ? ");

            selectStatement = connection.prepareStatement (
                    selectSql.toString (),
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY );

            selectStatement.setString(1, folderBoard);

            resultSet = selectStatement.executeQuery ();

            while (resultSet.next()) {
                forumboard = new HashMap();
                forumboard.put("id", resultSet.getString(1));
                forumboard.put("title", resultSet.getString(2));
                forumboard.put("description", resultSet.getString(3));
                resultList.add ( forumboard );
            }
        } finally {
            if ( resultSet != null ) {
                resultSet.close ();
                resultSet = null;
            }
            if ( selectStatement != null ) {
                selectStatement.close ();
                selectStatement = null;
            }
        }
        return resultList;
    }

    /**
     * 取得指定版块信息.
     *
     * @return
     * @throws SQLException
     */
    public Map getBoard(String boardId) throws SQLException, ObjectNotExistsException {
        StringBuffer selectSql = null;
        PreparedStatement selectStatement = null;
        ResultSet resultSet = null;
        Map forumboard = null;
        try {
            selectSql = new StringBuffer();
            selectSql.append(" SELECT ID , ");
            selectSql.append("        TITLE , ");
            selectSql.append("        DESCRIPTION  ");
            selectSql.append(" FROM FORUMBOARD ");
            selectSql.append(" WHERE ID = ? ");

            selectStatement = connection.prepareStatement(
                    selectSql.toString (),
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            selectStatement.setString(1, boardId);

            resultSet = selectStatement.executeQuery();

            if (resultSet.next()) {
                forumboard = new HashMap();
                forumboard.put("id", resultSet.getString(1));
                forumboard.put("title", resultSet.getString(2));
                forumboard.put("description", resultSet.getString(3));
            } else {
                throw new ObjectNotExistsException("not found data in database.");
            }
        } finally {
            if ( resultSet != null ) {
                resultSet.close ();
                resultSet = null;
            }
            if ( selectStatement != null ) {
                selectStatement.close ();
                selectStatement = null;
            }
        }
        return forumboard;
    }



//    /**
//     * 向数据库表中插入一条记录.<br>
//     * 将argForumboard中的数据插入到数据库中.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @param argForumboard 将要插入的数据
//     * @return 被插入数据的条数
//     * @throws SQLException SQL异常
//     */
//    public int insert( Forumboard argForumboard ) throws SQLException {
//        StringBuffer insertSql = null;
//        PreparedStatement insertStatement = null;
//        try {
//            insertSql = new StringBuffer();
//            insertSql.append(" INSERT INTO forumboard ( ");
//            insertSql.append(" ID , ");
//            insertSql.append(" TITLE , ");
//            insertSql.append(" DESCRIPTION , ");
//            insertSql.append(" BOARD ) ");
//            insertSql.append(" VALUES ( ");
//            insertSql.append(" ? , ");
//            insertSql.append(" ? , ");
//            insertSql.append(" ? , ");
//            insertSql.append(" ? ) ");
//
//            insertStatement = connection.prepareStatement ( insertSql.toString () );
//            insertStatement.setString ( 1, argForumboard.getId () );
//            insertStatement.setString ( 2, argForumboard.getTitle () );
//            insertStatement.setString ( 3, argForumboard.getDescription () );
//            insertStatement.setString ( 4, argForumboard.getBoard () );
//
//            return insertStatement.executeUpdate ();
//        } finally {
//            if (insertStatement!=null) {
//                insertStatement.close ();
//                insertStatement = null;
//            }
//        }
//    }

//    /**
//     * 更新数据库表中某条记录.<br>
//     * 根据argForumboard中的主键,更新数据库中的数据,但是主键的字段不会被更新.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @param argForumboard 将要更新的数据
//     * @return updated 被更新数据的条数
//     * @throws SQLException SQL异常
//     */
//    public int update( Forumboard argForumboard ) throws SQLException {
//        StringBuffer updateSql = null;
//        PreparedStatement updateStatement = null;
//        try {
//            updateSql = new StringBuffer();
//            updateSql.append(" UPDATE forumboard SET ");
//            updateSql.append(" ID = ? , ");
//            updateSql.append(" TITLE = ? , ");
//            updateSql.append(" DESCRIPTION = ? , ");
//            updateSql.append(" BOARD = ? ");
//            updateSql.append(" WHERE ID = ? ");
//
//
//            updateStatement = connection.prepareStatement ( updateSql.toString () );
//
//            updateStatement.setString ( 1, argForumboard.getId () );
//            updateStatement.setString ( 2, argForumboard.getTitle () );
//            updateStatement.setString ( 3, argForumboard.getDescription () );
//            updateStatement.setString ( 4, argForumboard.getBoard () );
//
//            updateStatement.setString ( 5, argForumboard.getId () );
//
//
//            return updateStatement.executeUpdate ();
//        } finally {
//            if ( updateStatement != null ) {
//                updateStatement.close ();
//                updateStatement = null;
//            }
//        }
//    }
//
//    /**
//     * 删除数据库表中指定主键的数据.<br>
//     * 根据主键,删除数据库中的数据.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @param argId String
//     * @return 被删除数据的条数
//     * @throws SQLException SQL异常
//     */
//    public int delete( String argId ) throws SQLException {
////    public int delete(  ) throws SQLException {
//        StringBuffer deleteSql = null;
//        PreparedStatement deleteStatement = null;
//        try {
//            deleteSql = new StringBuffer ();
//            deleteSql.append(" DELETE FROM forumboard ");
//            deleteSql.append(" WHERE ID = ? ");
//
//
//            deleteStatement = connection.prepareStatement ( deleteSql.toString () );
//
//            deleteStatement.setString ( 1, argId );
//
//
//            return deleteStatement.executeUpdate ();
//        } finally {
//            if ( deleteStatement != null ) {
//                deleteStatement.close ();
//                deleteStatement = null;
//            }
//        }
//    }
//
//    /**
//     * 删除数据库表中所有的数据.<br>
//     *
//     * @return 被删除数据的条数
//     * @throws SQLException SQL异常
//     */
//    public int deleteAllRecords() throws SQLException {
//        StringBuffer deleteSql = null;
//        PreparedStatement deleteStatement = null;
//        try {
//            deleteSql = new StringBuffer ();
//            deleteSql.append(" DELETE FROM forumboard ");
//
//            deleteStatement = connection.prepareStatement ( deleteSql.toString () );
//            return deleteStatement.executeUpdate ();
//        } finally {
//            if ( deleteStatement != null ) {
//                deleteStatement.close ();
//                deleteStatement = null;
//            }
//        }
//    }
//
//    /**
//     * 从数据库表中取得指定主键的数据.<br>
//     * 根据主键,从数据库中取得数据.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * <pre>
//     * 注意:如果指定的条件没有取得到数据时,将会抛出一个RecordNotFoundException异常,
//     *      应该在调用这个方法的地方处理这个异常.
//     * </pre>
//     *
//     * @param argId String
//     * @return 取得的数据对象实例
//     * @throws SQLException SQL异常
//     * @throws RecordNotFoundException 没有找到数据
//     */
//    public Forumboard select( String argId ) throws SQLException, RecordNotFoundException {
////    public Forumboard select(  ) throws SQLException, RecordNotFoundException {
//
//        StringBuffer selectSql = null;
//        PreparedStatement selectStatement = null;
//        ResultSet resultSet = null;
//        Forumboard forumboard = null;
//        try {
//            selectSql = new StringBuffer ();
//            selectSql.append(" SELECT ID , ");
//            selectSql.append("        TITLE , ");
//            selectSql.append("        DESCRIPTION , ");
//            selectSql.append("        BOARD ");
//            selectSql.append(" FROM forumboard ");
//            selectSql.append(" WHERE ID = ? ");
//
//
//            selectStatement = connection.prepareStatement (
//                    selectSql.toString (),
//                    ResultSet.TYPE_SCROLL_INSENSITIVE,
//                    ResultSet.CONCUR_READ_ONLY);
//
//            selectStatement.setString ( 1, argId );
//
//
//            resultSet = selectStatement.executeQuery ();
//
//            if (resultSet.next ()) {
//                forumboard = new Forumboard ();
//                forumboard.setId( resultSet.getString ( 1 ) );
//                forumboard.setTitle( resultSet.getString ( 2 ) );
//                forumboard.setDescription( resultSet.getString ( 3 ) );
//                forumboard.setBoard( resultSet.getString ( 4 ) );
//
//            } else {
//                throw new RecordNotFoundException("not found data in database.");
//            }
//        } finally {
//            if ( resultSet != null ) {
//                resultSet.close ();
//                resultSet = null;
//            }
//            if ( selectStatement != null ) {
//                selectStatement.close ();
//                selectStatement = null;
//            }
//        }
//        return forumboard;
//    }
//
//    /**
//     * 从数据库表中取得指定索引范围的所有数据.<br>
//     * 从数据库表中取得从argStartIndex到argEndIndex的数据,并使用数据对象封装,顺序排列
//     * 在结果列表中.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @param argStartIndex 开始索引
//     * @param argEndIndex 结束索引
//     * @return 取得的数据列表
//     * @throws SQLException SQL异常
//     */
//    public List selectAllRecords( int argStartIndex, int argEndIndex ) throws SQLException {
//        StringBuffer selectSql = null;
//        PreparedStatement selectStatement = null;
//        ResultSet resultSet = null;
//        Forumboard forumboard = null;
//        List resultList = new ArrayList ();
//        int curIndex = 0;
//        try {
//            selectSql = new StringBuffer ();
//            selectSql.append(" SELECT ID , ");
//            selectSql.append("        TITLE , ");
//            selectSql.append("        DESCRIPTION , ");
//            selectSql.append("        BOARD ");
//            selectSql.append(" FROM forumboard ");
//
//            selectStatement = connection.prepareStatement (
//                    selectSql.toString (),
//                    ResultSet.TYPE_SCROLL_INSENSITIVE,
//                    ResultSet.CONCUR_READ_ONLY );
//
//            resultSet = selectStatement.executeQuery ();
//            if ( resultSet.absolute ( argStartIndex ) ) {
//                curIndex = argStartIndex;
//                do {
//                    forumboard = new Forumboard ();
//                    forumboard.setId( resultSet.getString ( 1 ) );
//                    forumboard.setTitle( resultSet.getString ( 2 ) );
//                    forumboard.setDescription( resultSet.getString ( 3 ) );
//                    forumboard.setBoard( resultSet.getString ( 4 ) );
//
//                    resultList.add ( forumboard );
//                    curIndex++;
//                } while ( resultSet.next () && ( curIndex <= argEndIndex ) );
//            }
//        } finally {
//            if ( resultSet != null ) {
//                resultSet.close ();
//                resultSet = null;
//            }
//            if ( selectStatement != null ) {
//                selectStatement.close ();
//                selectStatement = null;
//            }
//        }
//        return resultList;
//    }
//    /**
//     * 从数据库表中取得所有数据.<br>
//     * 从数据库表中取得所有数据,并使用数据对象封装,顺序排列在结果列表中.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @return 取得的数据列表
//     * @throws SQLException SQL异常
//     */
//    public List selectAllRecords() throws SQLException {
//        return selectAllRecords ( 1, Integer.MAX_VALUE );
//    }
//    /**
//     * 从数据库表中取得所有数据的条数.<br>
//     * 从数据库表中取得所有数据的条数,并返回.
//     *
//     * TODO:根据具体的需要可能需要一些修改,如果已经修改了,请在这里加上注释,如果不需要
//     *      修改,请删除这段TODO注释.
//     *
//     * @return 所有数据的条数
//     * @throws SQLException SQL异常
//     */
//    public int size() throws SQLException {
//        StringBuffer selectSql = null;
//        PreparedStatement selectStatement = null;
//        ResultSet resultSet = null;
//        int count = 0;
//        try {
//            selectSql = new StringBuffer ();
//            selectSql.append(" SELECT COUNT(*) AS CNT FROM forumboard ");
//
//            selectStatement = connection.prepareStatement ( selectSql.toString () );
//            resultSet = selectStatement.executeQuery ();
//            if ( resultSet.next () ) {
//                count = resultSet.getInt ( 1 );
//            }
//            return count;
//        } finally {
//            if ( resultSet != null ) {
//                resultSet.close ();
//                resultSet = null;
//            }
//            if ( selectStatement != null ) {
//                selectStatement.close ();
//                selectStatement = null;
//            }
//        }
//    }

}
